import packageConfig from '../package.json'

/**
 * 随机打乱题库顺序，并取出num道题目
 * @param {Array} arr 题库数组
 * @param {Number} num 取出题目数量 默认100
 */
export function shuffleAndPick(arr, num = 100) {
  // 打乱数组
  function shuffle(array) {
    for (let i = array.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [array[i], array[j]] = [array[j], array[i]]
    }
    return array
  }
  // 打乱后的数组取前num个（或数组长度不足num时全部）
  const shuffledArr = shuffle(arr)
  return shuffledArr.slice(0, Math.min(shuffledArr.length, num))
}

/**
 * 比较两个简单数组中元素是否相同
 * @param {array,string} arr1
 * @param {array,string} arr2
 */
export function arrEqual(arr1, arr2) {
  if (!Array.isArray(arr1)) {
    arr1 = [arr1]
  }
  if (!Array.isArray(arr2)) {
    arr2 = [arr2]
  }
  if (arr1.length !== arr2.length) return false
  return arr1.every((value) => arr2.includes(value))
}

/**
 * 数据分割为二维数组
 * @param {Object} array 原数组
 * @param {Object} size 分割尺寸
 */
export function chunk(array, size) {
  if (!Array.isArray(array) || !Number.isFinite(size) || size < 1) {
    throw new TypeError('Expected an array and a positive finite number');
  }

  let index = 0;
  const result = [];

  while (index < array.length) {
    result.push(array.slice(index, index += size));
  }

  return result;
}

/**
 * 精确将分转为元
 * @param {Object} fen 金额(分) 100分=1元
 */
export function convertFenToYuan(fen) {
  if (!fen) return 0
  // 将分转换为元，过程中放大100倍
  let yuan = fen / 100;
  // 创建一个足够大的基数（这里是100）的幂次，用于去除不需要的小数位
  const base = 10;
  const precision = 2;
  const multiplier = base ** precision;
  // 四舍五入并转为整数，然后再除以基数的幂次，得到精确到小数点后两位的结果
  return (Math.round(yuan * multiplier) / multiplier);
}

// 版权
export function copyright() {
  /* 版权样式 */
  const styleTitle1 = `font-size:18px;font-weight:700;color:#ff4500;`
  const styleTitle2 = `font-style:oblique;font-size:14px;color:#fb7299;`
  const styleContent = `color:#66ccff;`
  /* 版权信息 */
  const title1 = `📝 sv-exam-plus v${packageConfig.version} 💯`
  const title2 = 'by 夏夜追凉丶(Sonve)'
  const content = `
  版权声明：
  1. sv-exam-plus版权完全属于 "夏夜追凉丶(Sonve)"，作者将保留对此版权信息的最终解释权
  2. 任何单位和机构在遵守下列条件的前提下提供授权使用:
    1) 已通过合法途径购买并获得了本插件的使用权
    2) 普通授权版需要保留此版权声明在控制台输出
    3) 您不得以任何形式发布、售卖本插件，或以其他任何形式侵犯本插件的版权及其附属权利
  3. 购买成功将默认您同意上述条款，使用本插件开发项目时，需注明此插件来源
  🏠 地址: https://ext.dcloud.net.cn/plugin?id=16728
  💬 微信: s1051399604
  🐧 QQ群: 852637893
  `
  console.log(`%c${title1} %c${title2} %c${content}`, styleTitle1, styleTitle2, styleContent)
}

// 富文本解析成选项数组
export function parseRichTextToOptions(tableHtml) {
  let tempDiv = document.createElement('div')
  tempDiv.innerHTML = tableHtml
  let table = tempDiv?.querySelector('table')
  let tbody = table?.querySelector('tbody')
  if (!table || !tbody) {
    uni.showToast({
      title: '选项必须放入表格中',
      icon: 'none',
    })
    return []
  }
  // slice(1)用于删除表头
  let options = Array.from(tbody.rows).map((row, rowIndex) => {
    let keyCell = row.cells[0]
    let valueCell = row.cells[1]
    // 获取key
    let key = keyCell.textContent.trim()
    // 获取value，并包裹在div标签内
    let value = `<div>${valueCell.innerHTML}</div>` // 如果需要保留原样式的HTML内容，直接使用innerHTML即可
    return { key, value }
  })
  // 将所有key转换为大写字母
  options = options.filter((item) => {
    // 判断key是不是单字母
    if (/^[a-zA-Z]$/.test(item.key)) {
      return {
        key: item.key.toUpperCase(),
        value: item.value
      }
    }
  })
  return options
}

// 选项数组解析成富文本
export function parseOptionsToRichText(options) {
  let tableHtml = '<table style="width: 100%;">'
  // 添加表头行
  tableHtml += '<thead><tr><th width="10%">选项</th><th width="90%">内容</th></tr></thead>'
  tableHtml += '<tbody>'
  for (const { key, value } of options) {
    tableHtml += `
      <tr>
        <td style="text-align: center;">${key}</td>
        <td>${value.replace(/^<div>/, '').replace(/<\/div>$/, '')}</td>
      </tr>
    `
  }
  tableHtml += '</tbody></table>'
  return tableHtml
}

export const presetTemplate = `<table style="width: 100%;"><tbody><tr><th colSpan="1" rowSpan="1" width="10%">选项</th><th colSpan="1" rowSpan="1" width="90%">内容</th></tr><tr><td colspan="1" rowspan="1" width="auto" style="text-align: center;">A</td><td colSpan="1" rowSpan="1" width="auto">这是选项A的内容</td></tr><tr><td colspan="1" rowspan="1" width="auto" style="text-align: center;">B</td><td colSpan="1" rowSpan="1" width="auto">这是选项B的内容</td></tr><tr><td colspan="1" rowspan="1" width="auto" style="text-align: center;">C</td><td colSpan="1" rowSpan="1" width="auto">这是选项C的内容</td></tr><tr><td colspan="1" rowspan="1" width="auto" style="text-align: center;">D</td><td colSpan="1" rowSpan="1" width="auto">这是选项D的内容</td></tr></tbody></table><p><br></p>`